package com.social.socialservice.idal;

import com.social.socialservice.model.FansListInfo;
import com.social.socialservice.model.LoginRecordInfo;
import com.social.socialservice.model.UserInfo;
import com.social.socialservice.unit.Pager;
import org.apache.catalina.User;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.StatementType;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 用户接口方法定义
 */
@Mapper
@Component
public interface IUserDAL {
    /**
     * 用户注册功能
     * 1. 判断用户名和注册邮箱是否已使用，使用过的不可以注册
     * 2. 用户输入邮箱注册，邮箱发送验证码，输入验证码正确之后进行注册
     * 3. 添加新的用户账户
     */

    /**
     * 验证用户名是否存在
     * @param userInfo
     * @return
     */
    @Select("select count(*) from ex_user where username=#{username}")
    public Integer validateUser(UserInfo userInfo);

    /**
     * 验证注册邮箱是否已经使用过
     * @param userInfo
     * @return
     */
    @Select("select count(*) from ex_user where user_email=#{user_email}")
    public Integer validateUserEmail(UserInfo userInfo);

    /**
     * 添加用户信息
     * @param userInfo
     * @return
     */
    @Insert("insert into ex_user(username,user_nickname,user_pass,user_email)values(#{username},#{username},#{user_pass},#{user_email})")
    public Integer AddUser(UserInfo userInfo);


    /**
     * 用户登录功能 - token认证
     * 1. 判断用户名和密码是否正确 - 前端判断
     * 2. 判断当前登录用户是否处于禁用状态 - 该状态不可登录
     * 3. 判断当前登录用户是否处于禁言状态 - 可登录带着该状态参数不能发言
     */
    @Select("select user_id,username,user_nickname,user_lock,user_headimg,user_bgimg,auth_id,auth_input_limit,user_lang from ex_user " +
            "where user_isBlock=0 and (username=#{username} or user_email=#{user_email}) " +
            "and user_pass=#{user_pass}")
    public UserInfo LoginUser(UserInfo userInfo);

    /**
     * 用户登录成功后记录用户登录信息
     * 登录时间、地点、IP地址等
     */
    @Insert("insert into ex_loginrecord(user_id,login_ip,login_lan_ip,login_city,login_regionName,login_location,login_country,login_lat,login_lon)" +
            "values(#{user_id},#{login_ip},#{login_lan_ip},#{login_city},#{login_regionName},#{login_location},#{login_country},#{login_lat},#{login_lon})")
    public Integer addUserLoginRecord(LoginRecordInfo loginRecordInfo);


    /**
     * 用户认证
     * 1. 用户未认证状态下不能发布贴文
     */


    /**
     * 用户修改认证信息
     * 1. 通过注册邮箱或手机获取验证码
     * 2. 验证码通过，修改认证信息，
     * 3. 重新认证
     */

    /**
     * 用户修改自己的密码
     * 1. 通过注册邮箱或手机，获取验证码
     * 2. 验证码通过，修改密码
     */

    /**
     * 用户修改非敏感信息,个人资料
     * 1. 背景图片-可选
     * 2. 头像-可选
     * 3. 其他表单数据
     */
    @Update("<script>"+
            "update ex_user set " +
            "<if test='user_bgimg!=null and user_bgimg!= \"\"'>" +
            "user_bgimg = #{user_bgimg}," +
            "</if>" +
            "<if test='user_headimg!=null and user_headimg!= \"\"'>" +
            "user_headimg = #{user_headimg}," +
            "</if>" +
            "user_nickname = #{user_nickname},user_info =#{user_info}"+
            " where user_id=#{user_id}" +
            "</script>")
    public Integer EditUserInfo(UserInfo userInfo);

    /**
     * ***************** 管理员操作用户 *****************
     */

    /**
     * 修改用户禁言状态
     */

    /**
     * 修改用户禁用状态
     */

    /**
     * 清理用户
     * 1. 删除无用或者垃圾账户
     */


    /**
     * 生成注册验证码
     * 用于用户注册使用
     */
    @Insert("insert into ex_code(user_email,code_string)values(#{user_email},#{code_string})")
    public Integer setValidateCode(UserInfo userInfo);

    /**
     * 验证注册验证码
     * 返回true说明存在
     */
    @Select("select count(*) from ex_code where user_email=#{user_email} and code_string=#{code_string} and code_time >= NOW() - INTERVAL 15 MINUTE")
    public Integer validateCode(UserInfo userInfo);

    /**
     * 密码找回
     * 验证用户名或者邮箱是否存在，如果存在则发送重置链接到用户邮箱
     */
    @Select("select username,user_email from ex_user where username=#{username} or user_email = #{user_email};")
    public UserInfo getResetLink(UserInfo userInfo);

    /**
     * 密码找回验证成功后
     * 重置用户表中验证码及验证码生成时间
     */
    @Update("update ex_user set user_code=#{user_code},user_codetime=Now() where username=#{username} or user_email=#{user_email}")
    public Integer resetCode(UserInfo userInfo);

    /**
     * 密码找回
     * 通过验证重置码，修改个人密码
     * 通过用户名或邮箱地址二选一，并且验证码要正确才可以修改
     */
    @Update("update ex_user set user_pass=#{user_pass} where (username=#{username} or user_email=#{user_email}) and user_code=#{user_code} and user_codetime >= NOW() - INTERVAL 15 MINUTE")
    public Integer resetUserPass(UserInfo userInfo);

    /**
     * 登录后
     * 根据user_id获取用户动态信息
     * 关注者/被关注者/个性简介等
     */
    @Select("select user_id,username,user_nickname,user_headimg,user_bgimg,user_fo,user_fans,user_info,auth_id,ex_user.user_regtime from ex_user where user_id=#{user_id}")
    public UserInfo getInfoByUserId(UserInfo userInfo);


    /**
     * 与帖子转发、点赞状态一起，查询当前发帖的用户是否被当前登录用户关注
     */
    @Select("select count(*) from ex_fanslist where fans_fo_id=#{post_user_id} and fo_id=#{current_user_id}")
    public Integer getIsFoByCurrentUserId(FansListInfo fansListInfo);

    /**
     * 判断当前发帖人是否也关注了当前用户
     */
    @Select("select count(*) from ex_fanslist where fans_fo_id=#{current_user_id} and fo_id=#{post_user_id}")
    public Integer getByFoByPostUserId(FansListInfo fansListInfo);


    /**
     * 关注用户
     * 关注用户前判断当前是否已经关注了用户，避免重复关注，用上面的方法做判断即可
     */
    @Insert("insert into ex_fanslist(fans_fo_id,fo_id)values(#{post_user_id},#{current_user_id})")
    public Integer addUserFoPostUser(FansListInfo fansListInfo);


    /**
     * 取消关注用户
     */
    @Delete("delete from ex_fanslist where fans_fo_id=#{post_user_id} and fo_id=#{current_user_id}")
    public Integer delUserFoPostUser(FansListInfo fansListInfo);

    /**
     * 关注和取消关注用户后，更新当前用户与被关注/被取消关注用户的关注人数
     * 这里操作的人较多，建议使用存储过程一步完成
     * @返回值 error,如果值=0，则说明运行成功，不为0则运行失败
     */
    @Select("CALL ex_updateUserFoAndFansInfo(#{post_user_id},#{current_user_id})")
    @Options(statementType = StatementType.CALLABLE)
    public Integer updateUserFoAndFansInfo(FansListInfo fansListInfo);

    /**
     * 查询当前用户关注的用户id集合
     */
    @Select("select * from ex_fanslist where fo_id =#{current_user_id}")
    public List<FansListInfo> getCurrentUserFoUserList(Pager pager);


    /**
     * 更新认证信息
     */
    @Update("update ex_user set auth_id=#{auth_id},auth_input_limit=#{auth_input_limit} where user_id=#{user_id}")
    public Integer updateUserAuth(UserInfo userInfo);


    /**
     * 重新获取当前用户基本信息，用于刷新
     */
    @Select("select user_id,username,user_nickname,user_headimg,user_bgimg,user_fo,user_fans,user_info,auth_id,auth_input_limit,user_lang,ex_user.user_regtime from ex_user where user_id=#{user_id}")
    public UserInfo getUserInfoByUserId(UserInfo userInfo);
}
